﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace TodayHumor {
    public partial class Write : PhoneApplicationPage {
        string title, content, tail, table;

        public Write() {
            InitializeComponent();
        }

        #region Navigation 이벤트 핸들러
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) {
            table = this.NavigationContext.QueryString["table"];
        }
        #endregion

        #region 이벤트 핸들러
        private void TextBoxTextChanged(object sender, TextChangedEventArgs e) {
            TextBox tb = sender as TextBox;
            if (!string.IsNullOrEmpty(tb.Text)) {
                Brush foregroundBrush = (Brush)Application.Current.Resources["PhoneTextBoxForegroundBrush"];
                if (tb.Foreground != foregroundBrush)
                    tb.Foreground = foregroundBrush;
            }
        }

        private void WriteBtnClick(object sender, EventArgs e) {
            try {
                if (!String.IsNullOrEmpty(WriteTitleTextBox.Text)) {
                    Utilities.GeneratePI(this, "글을 서버에 업로드하고 있습니다..");

                    title = HttpUtility.HtmlEncode(WriteTitleTextBox.Text);
                    content = HttpUtility.HtmlEncode(WriteContentTextBox.Text);
                    content = content.Replace("\n", "<br/>");
                    tail = HttpUtility.HtmlEncode(WriteTailTextBox.Text);
                    tail = tail.Replace("\n", "<br/>");

                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://todayhumor.co.kr/board/insert.php");
                    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.590; .NET CLR 3.5.20706; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
                    req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded";
                    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                    req.CookieContainer = App.Cookies;

                    req.BeginGetRequestStream(new AsyncCallback(WriteRequestCallback), req);
                } else {
                    Deployment.Current.Dispatcher.BeginInvoke(delegate {
                        MessageBox.Show("제목이 입력되지 않았습니다. 제목을 입력하신 후 다시 실행해 주세요.");
                    });
                }
            } catch (WebException) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("인터넷에 연결되지 않아 글 작성을 할 수 없었습니다. 인터넷 연결 상황을 확인하신 후 다시 시도해주세요.");
                }); SystemTray.SetProgressIndicator(this, null);
            } catch (Exception exc) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("알 수 없는 오류로 인해 글 작성을 할 수 없었습니다. 오류명 : " + exc.GetType().ToString());
                }); SystemTray.SetProgressIndicator(this, null);
            }
        }

        void WriteRequestCallback(IAsyncResult result) {
            try {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    Encoding EucKrEncoding = new Korean.Text.Encoding.EuckrEncoding();

                    HttpWebRequest req = (HttpWebRequest)result.AsyncState;
                    Stream WriteStream = req.EndGetRequestStream(result);

                    string WriteData = String.Format("subject={0}&content={1}&tail={2}&table={3}", title, content, tail, table);
                    byte[] WriteDataArray = EucKrEncoding.GetBytes(WriteData);

                    WriteStream.Write(WriteDataArray, 0, WriteDataArray.Length);
                    WriteStream.Close();

                    req.BeginGetResponse(new AsyncCallback(WriteResultResponseCallback), req);
                });
            } catch (WebException) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("인터넷에 연결되지 않아 글 작성을 할 수 없었습니다. 인터넷 연결 상황을 확인하신 후 다시 시도해주세요.");
                });
            } catch (Exception exc) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("알 수 없는 오류로 인해 글 작성을 할 수 없었습니다. 오류명 : " + exc.GetType().ToString());
                });
            }
        }

        void WriteResultResponseCallback(IAsyncResult result) {
            try {
                HttpWebRequest req = (HttpWebRequest)result.AsyncState;
                HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(result);

                using (StreamReader ResultReader = new StreamReader(res.GetResponseStream(), new Korean.Text.Encoding.EuckrEncoding())) {
                    string ResultString = ResultReader.ReadToEnd();
                    if (ResultString.IndexOf("location.href") != -1) {
                        Deployment.Current.Dispatcher.BeginInvoke(delegate {
                            Thread.Sleep(500);
                            NavigationService.GoBack();
                        });
                    } else {
                        Deployment.Current.Dispatcher.BeginInvoke(delegate {
                            MessageBox.Show("게시글을 업로드하는 도중 오류가 발생했습니다. 이 문제가 계속 발생하면 다시 로그인하시거나 애플리케이션을 재시작해주세요.");
                        });
                    }
                }
            } catch (WebException) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("인터넷에 연결되지 않아 글 작성을 할 수 없었습니다. 인터넷 연결 상황을 확인하신 후 다시 시도해주세요.");
                }); SystemTray.SetProgressIndicator(this, null);
            } catch (Exception exc) {
                Deployment.Current.Dispatcher.BeginInvoke(delegate {
                    MessageBox.Show("알 수 없는 오류로 인해 글 작성을 할 수 없었습니다. 오류명 : " + exc.GetType().ToString());
                }); SystemTray.SetProgressIndicator(this, null);
            }
        }

        private void BackBtnClick(object sender, EventArgs e) {
            NavigationService.GoBack();
        }
        #endregion
    }
}